import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 设置图片清晰度
plt.rcParams['figure.dpi'] = 300

# 检查文泉驿正黑字体是否可用，如果不可用则使用黑体
if 'WenQuanYi Zen Hei' not in [f.name for f in fm.fontManager.ttflist]:
    plt.rcParams['font.sans-serif'] = ['SimHei']
else:
    plt.rcParams['font.sans-serif'] = ['WenQuanYi Zen Hei']

def load_data(file_path):
    """
    加载数据集
    :param file_path: 数据集文件路径
    :return: 加载后的DataFrame
    """
    return pd.read_csv(file_path)

def analyze_missing_values(df):
    """
    分析数据集中的缺失值情况
    :param df: 输入的DataFrame
    :return: 包含缺失值数量和比例的DataFrame
    """
    missing_values = df.isnull().sum()
    missing_values_percentage = df.isnull().mean() * 100
    return pd.concat([missing_values, missing_values_percentage], axis=1).rename(columns={'0': '缺失值数量', '1': '缺失值比例(%)'})

def plot_payment_ability_distribution(df):
    """
    绘制不同国家支付能力指标的分布箱线图
    :param df: 包含支付能力数据的DataFrame
    """
    df.boxplot(column=['CoCA', 'CoNA', 'CoRD'], by='country_code', figsize=(15, 8))
    plt.title('不同国家的支付能力指标的分布情况')
    plt.xlabel('国家代码')
    plt.xticks(rotation=45)
    plt.ylabel('支付能力指标')
    plt.show()

def categorize_countries_by_payment_ability(df):
    """
    根据CoRD指标将国家划分为低、中等和高支付能力的类别
    :param df: 包含支付能力数据的DataFrame
    """
    # 计算CoRD的分位数作为区间边界
    q1 = df['CoRD'].quantile(0.33)
    q2 = df['CoRD'].quantile(0.66)

    # 根据区间边界划分国家类别
    low_ability = df[df['CoRD'] <= q1]
    medium_ability = df[(df['CoRD'] > q1) & (df['CoRD'] <= q2)]
    high_ability = df[df['CoRD'] > q2]

    print(f"低支付能力国家数量: {len(low_ability)}")
    print(f"中等支付能力国家数量: {len(medium_ability)}")
    print(f"高支付能力国家数量: {len(high_ability)}")

    # 返回区间边界和国家类别数据，用于后续可视化
    return q1, q2, low_ability, medium_ability, high_ability

def plot_country_category_count(q1, q2, low_ability, medium_ability, high_ability):
    """
    绘制不同支付能力区间国家数量的条形图
    :param q1: 低支付能力区间上限（CoRD的第一个分位数）
    :param q2: 中等支付能力区间上限（CoRD的第二个分位数）
    :param low_ability: 低支付能力国家数据
    :param medium_ability: 中等支付能力国家数据
    :param high_ability: 高支付能力国家数据
    """
    categories = ['低支付能力国家', '中支付能力国家', '高支付能力国家']
    counts = [len(low_ability), len(medium_ability), len(high_ability)]

    plt.bar(categories, counts)
    plt.title('世界国家支付能力区分及大概数量图')
    plt.xlabel('支付能力区间')
    plt.ylabel('数量')

    # 在柱状图上添加具体数字
    for i, count in enumerate(counts):
        plt.text(i, count, str(count), ha='center', va='bottom')

    plt.show()

if __name__ == "__main__":
    file_path = '支付能力.csv'
    # 加载数据集
    data = load_data(file_path)
    print("数据基本信息：")
    print(data.info())
    print("数据的前几行：")
    print(data.head())

    # 分析缺失值
    missing = analyze_missing_values(data)
    print(missing)

    # 绘制支付能力指标分布箱线图
    plot_payment_ability_distribution(data)

    # 按支付能力划分国家区间并统计数量，获取相关数据用于可视化
    q1, q2, low_ability, medium_ability, high_ability = categorize_countries_by_payment_ability(data)

    # 绘制不同支付能力区间国家数量的条形图
    plot_country_category_count(q1, q2, low_ability, medium_ability, high_ability)
    import pandas as pd

# 加载数据集
df = pd.read_csv('支付能力.csv')

print("数据基本信息：")
print(df.info())
print("数据的前几行：")
print(df.head())
# 选择数值列进行统计描述
numeric_columns = ['CoCA', 'CoNA', 'CoRD', 'CoRD_f', 'CoRD_v', 'CoRD_ss', 'CoRD_asf', 'CoRD_lns', 'CoRD_of', 'CoCA_headcount', 'CoNA_headcount', 'CoRD_headcount', 'CoCA_unafford_n', 'CoNA_unafford_n', 'gdp']
stats = df[numeric_columns].describe()
print("数值列统计描述：")
print(stats)
import matplotlib.pyplot as plt

# 设置图片清晰度
plt.rcParams['figure.dpi'] = 300
# 设置中文字体（假设已解决字体问题，如使用黑体 'SimHei'）
plt.rcParams['font.sans-serif'] = ['SimHei']

# 绘制GDP的直方图
plt.hist(df['gdp'], bins=20)
plt.title('GDP分布直方图')
plt.xlabel('GDP')
plt.ylabel('国家数量')
plt.show()
# 绘制散点图观察CoCA与CoNA的关系
plt.scatter(df['CoCA'], df['CoNA'])
plt.title('CoCA与CoNA的关系散点图')
plt.xlabel('CoCA')
plt.ylabel('CoNA')
plt.show()

# 绘制散点图观察CoRD与GDP的关系
plt.scatter(df['CoRD'], df['gdp'])
plt.title('CoRD与GDP的关系散点图')
plt.xlabel('CoRD')
plt.ylabel('GDP')
plt.show()
# 提取国家代码首字母
df['country_code_first_letter'] = df['country_code'].str[0]
letter_counts = df['country_code_first_letter'].value_counts()
print("国家代码首字母分布：")
print(letter_counts)

# 绘制饼图展示国家代码首字母分布
plt.pie(letter_counts, labels=letter_counts.index, autopct='%1.1f%%')
plt.title('国家代码首字母分布饼图')
plt.show()
